iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
1
自我挑戰組

神羅天征! 一起(爆肝)征服程式解題系列 第 23

[Day 23] LeetCode - 283 Move Zeroes

  • 分享至 

  • xImage
  •  

本篇同步發布於Blog:[解題] LeetCode - 283 Move Zeroes

平台:

LeetCode

題號:

283 - Move Zeroes

題目連結:

https://leetcode.com/problems/move-zeroes/

題目說明:

        輸入1個陣列nums,將有0的元素都移到陣列最後面,而前面非0的元素相對順序要和原本一樣。

比如範例輸入的[0,1,0,3,12],移動完後變成[1,3,12,0,0]。

解題方法:

    使用一個變數lastZeroIndex,用來記錄0的位置。從索引值最小開始檢查每個nums的元素 ,只要是非0就做與nums[lastZeroIndex]交換的動作,這動作會把0一直往後移。

以範例輸入[0,1,0,3,12]:

  1. nums[0] = 0,換下一個元素
  2. nums[1] = 1,交換nums[1] 與 nums[lastZeroIndex = 0] => 變成[1, 0, 0, 3, 12], lastZeroIndex + 1,換下一個元素
  3. nums[2] = 0,換下一個元素
  4. nums[3] = 3,交換nums[3] 與 nums[lastZeroIndex = 1] => 變成[1, 3, 0, 0, 12], lastZeroIndex + 1,換下一個元素
  5. nums[4] = 12,交換nums[4] 與 nums[lastZeroIndex = 2] => 變成[1, 3, 12, 0, 0], lastZeroIndex + 1

所以最終答案是[1, 3, 12, 0, 0]

難度為Easy

程式碼 (C++ 與 C#):

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size();
        int lastZeroIndex = 0;
        for(int i = 0 ; i < n;++i){
            if(nums[i] != 0){
                swap(nums[i], nums[lastZeroIndex++]);
            }
        }
    }
};

int main() {
	Solution sol;
	vector<int> nums{0,1,0,3,12};
	sol.moveZeroes(nums);
	for(int num : nums){
		cout << num << " ";
	}
	return 0;
}
using System;
 
namespace LeetCode283
{
	public class Program
	{
		public class Solution {
		    public static void Swap<T> (ref T lhs, ref T rhs) {
		        T temp = lhs;
		        lhs = rhs;
		        rhs = temp;
		    }
 
		    public void MoveZeroes(int[] nums) {
		        int size = nums.Length;
		        int lastZeroIndex = 0;
		        for(int i = 0 ; i < size;++i){
		            if(nums[i] != 0){
		                Swap<int>(ref nums[i], ref nums[lastZeroIndex++]);
		            }
		        }
		    }
		}
		public static void Main()
		{
			int[] nums = new int[]{0,1,0,3,12};
			Solution sol = new Solution();
			sol.MoveZeroes(nums);
			foreach(int num in nums){
				Console.Write(" " + num);
			}
 
			Console.Read();
		}
	}
}

GITHUB位置(C++ 與 C#):

https://github.com/u8989332/ProblemSolving/blob/master/LeetCode/C%2B%2B/200-299/283.cpp

https://github.com/u8989332/ProblemSolving/blob/master/LeetCode/C%23/200-299/283.cs


上一篇
[Day 22] LeetCode - 66 Plus One
下一篇
[Day 24] LeetCode - 1 Two Sum
系列文
神羅天征! 一起(爆肝)征服程式解題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言